package gestionBulletins.controller;

import gestionBulletins.model.Adherent;
import gestionBulletins.model.Enfant;
import gestionBulletins.model.persistance.DaoEnfant;
import gestionBulletins.model.persistance.DaoFactory;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.table.AbstractTableModel;

/**
 * Sert de modèle abstrait pour la JTable qui s'occupe de la vue graphique
 * C'est cette classe qui dialogue avec les DAO appropriés
 * @author Paraita Wohler
 *
 */
public class EnfantsTableModel extends AbstractTableModel implements Observer {

	private static final long serialVersionUID = 1L;
	private ArrayList<Enfant> data;
	private DaoFactory daoFactory;
	private Adherent parent;
	private String[] nomCols = { "Nom", "Prénom", "Date de naissance",
								 "Sexe" };
	
	/**
	 * Constructeur
	 * @param daoFactory le daoFactory utilisé par la classe pour les opérations sur la base de données
	 * @param vue la vue parente
	 * @param parent le parent de l'enfant selectionné
	 */
	public EnfantsTableModel(DaoFactory daoFactory, JFrame vue, Adherent parent) {
		super();
		this.daoFactory = daoFactory;
		this.parent = parent;
		getData();
	}
	
	/**
	 * setter du parent de l'enfant selectionné
	 * @param parent le parent à attribuer
	 */
	public void setParent(Adherent parent) {
		this.parent = parent;
	}
	
	/**
	 * permet de retourner toutes les informations relatives aux enfants de l'adhérent parent
	 */
	public void getData() {
		if (parent != null) {
			DaoEnfant de = daoFactory.getDaoEnfant();
			data = (ArrayList<Enfant>) de.requestAllByParentId(parent);
		}
	}

	@Override
	public int getColumnCount() {
		if (parent != null) {
			return nomCols.length;
		}
		return 0;
	}

	@Override
	public int getRowCount() {
		if (parent != null) {
			return data.size();
		}
		return 0;
	}
	
	@Override
	public Class<?> getColumnClass(int arg0) {
		return String.class;
	}
	
	@Override
	public String getColumnName(int arg0) {
		return nomCols[arg0];
	}
	
	@Override
	public boolean isCellEditable(int arg0, int arg1) {
		return false;
	}

	@Override
	public Object getValueAt(int arg0, int arg1) {
		if (parent != null) {
			Enfant e = data.get(arg0);
			switch(arg1) {
			case 0:
				return e.getNom();
			case 1:
				return e.getPrenom();
			case 2:
				String date = e.getDateNaissanceJour() + "-" +
							  e.getDateNaissanceMois() + "-" +
							  e.getDateNaissanceAnnee();
				return date;
			case 3:
				return e.getSexe();
			}
		}
		return null;
	}

	/**
	 * permet de récupérer un enfant de la table
	 * @param rowNum le numéro de la ligne de l'enfant selectionné
	 * @return l'enfant selectionné
	 */
	public Enfant getEnfant(int rowNum) {
		return data.get(rowNum);
	}
	
	/**
	 * enleve de la table une ligne
	 * @param row le numéro de la ligne a enlever
	 */
	public void removeRow(int row) {
		data.remove(row);
	}
	
	@Override
	public void update(Observable arg0, Object arg1) {
		getData();
		fireTableDataChanged();
	}

}
